home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / SPALTENS.M < prev    next >
Encoding:
Text File  |  1994-01-29  |  5.0 KB  |  189 lines

  1. MODULE SpaltenSatz;
  2. (*$E MOS *)
  3.  
  4. (*
  5.  * Fügt entweder die Texte zweier Dateien nebeneinander zusammen
  6.  * oder bereitet einen Text für zweispaltigen Druck vor.
  7.  *
  8.  * V1.2: Nun fehlen nicht mehr die letzten Zeilen, die nur Text in der
  9.  *       1. Spalte füllen.
  10.  *
  11.  * V1.3: Wird ein Argument übergeben, wird der Text der Datei zweispaltig
  12.  *       (80 Zeichen pro Spalte f. 139 Zl/Seite) unter dem selben Namen mit
  13.  *       der Endung ".2" erzeugt.
  14.  *       Außerdem wird kein FF mehr am Dateiende erzeugt und vor einem FF
  15.  *       steht kein CR/LF mehr.
  16.  *)
  17.  
  18. IMPORT GEMDOSIO;
  19. FROM ArgCV IMPORT InitArgCV, PtrArgStr;
  20. FROM InOut IMPORT Write, WriteLn, WriteString, WriteInt, WriteCard,
  21.         ReadString, ReadCard, ReadInt;
  22. IMPORT Files, Text;
  23. FROM Strings IMPORT Append, DelTrailingBlanks, Copy, Assign;
  24. FROM FileNames IMPORT ConcatName;
  25.  
  26. (*
  27.  * Mischt zwei Textfiles so, daß die Zeilen der 2. Datei rechts neben
  28.  * der 1. erscheinen.
  29.  *)
  30.  
  31. TYPE String = ARRAY [0..255] OF CHAR;
  32.  
  33. VAR spc, s1, s2, s3: String;
  34.     firstSide, ok, second, onefile, buffered: BOOLEAN;
  35.     f1, f2, f3: Files.File;
  36.     n: INTEGER;
  37.     ofs, lps, line, bufferedlines: INTEGER;
  38.     linebuf: ARRAY [1..200] OF String;
  39.     argc: CARDINAL;
  40.     argv: ARRAY [0..2] OF PtrArgStr;
  41.  
  42. PROCEDURE flush;
  43.   VAR l: INTEGER;
  44.   BEGIN
  45.     IF NOT firstSide & (bufferedlines > 0) THEN
  46.       Text.WritePg (f3);
  47.     END;
  48.     FOR l:= 1 TO bufferedlines DO
  49.       Text.WriteString (f3, linebuf[l]);
  50.       IF l = bufferedlines THEN
  51.         Text.Write (f3, CHR(13)); (* CR ohne LF *)
  52.       ELSE
  53.         Text.WriteLn (f3)
  54.       END;
  55.     END;
  56.     firstSide:= FALSE;
  57.     bufferedlines:= 0;
  58.     line:= 1
  59.   END flush;
  60.  
  61. BEGIN
  62.   FOR n:= 0 TO SIZE (spc)-1 DO
  63.     spc[n]:= ' '
  64.   END;
  65.   WriteString ("Spaltensatz V1.3"); WriteLn; WriteLn;
  66.   InitArgCV (argc, argv);
  67.   IF (argc = 2) THEN
  68.     Files.Open (f1, argv[1]^, Files.readSeqTxt);
  69.     WriteString ("Eingabedatei: "); WriteString (argv[1]^); WriteLn;
  70.     IF Files.State (f1) < 0 THEN
  71.       WriteString ('Fehler!');
  72.       WriteLn;
  73.       RETURN
  74.     END;
  75.     ConcatName (argv[1]^, "2", s1);
  76.     WriteString ("Ausgabedatei: "); WriteString (s1); WriteLn;
  77.     Files.Create (f3, s1, Files.writeSeqTxt, Files.replaceOld);
  78.     IF Files.State (f3) < 0 THEN
  79.       WriteString ('Fehler!');
  80.       WriteLn;
  81.       Files.Close (f2);
  82.       Files.Close (f1);
  83.       RETURN
  84.     END;
  85.     second:= FALSE;
  86.     onefile:= TRUE;
  87.     ofs:= 80;
  88.     lps:= 139;
  89.   ELSE
  90.     WriteString ("1. Datei? ");
  91.     ReadString (s1);
  92.     Files.Open (f1, s1, Files.readSeqTxt);
  93.     IF Files.State (f1) < 0 THEN
  94.       WriteString ('Fehler!');
  95.       WriteLn;
  96.       RETURN
  97.     END;
  98.     WriteString ("2. Datei (oder nix)? ");
  99.     ReadString (s1);
  100.     second:= s1[0] # '';
  101.     onefile:= ~second;
  102.     IF second THEN
  103.       Files.Open (f2, s1, Files.readSeqTxt);
  104.       IF Files.State (f2) < 0 THEN
  105.         WriteString ('Fehler!');
  106.         WriteLn;
  107.         Files.Close (f1);
  108.         RETURN
  109.       END;
  110.     END;
  111.     WriteString ("Ausgabedatei? ");
  112.     ReadString (s1);
  113.     Files.Create (f3, s1, Files.writeSeqTxt, Files.replaceOld);
  114.     IF Files.State (f3) < 0 THEN
  115.       WriteString ('Fehler!');
  116.       WriteLn;
  117.       Files.Close (f2);
  118.       Files.Close (f1);
  119.       RETURN
  120.     END;
  121.     WriteString ("Spaltenoffset? ");
  122.     ReadInt (ofs);
  123.     IF ofs = 0 THEN Files.Close (f3); Files.Close (f2); Files.Close (f1); RETURN END;
  124.     WriteString ("Zeilenanzahl pro Seite (0 f. unendlich)? ");
  125.     ReadInt (lps);
  126.     IF onefile & (lps = 0) THEN
  127.       WriteString ("Bei 1-File-Spaltendruck nicht erlaubt!");
  128.       WriteLn;
  129.       Files.Close (f3); Files.Close (f2); Files.Close (f1); RETURN
  130.     END;
  131.   END;
  132.   buffered:= onefile OR (lps > 0);
  133.   line:= 1;
  134.   bufferedlines:= 0;
  135.   firstSide:= TRUE;
  136.   LOOP
  137.     Text.ReadFromLine (f1, s1);
  138.     IF ~Files.EOF (f1) THEN Text.ReadLn (f1) END;
  139.     s2:= '';
  140.     IF onefile THEN
  141.       IF second THEN
  142.         s2:= s1;
  143.         s1:= linebuf[line]
  144.       END;
  145.     ELSIF second THEN
  146.       Text.ReadFromLine (f2, s2);
  147.       second:= ~Files.EOF (f2);
  148.       IF second THEN
  149.         Text.ReadLn (f2);
  150.         second:= ~Files.EOF (f2);
  151.       END;
  152.     END;
  153.     Copy (spc, 0, ofs-INT(LENGTH (s1)), s3, ok);
  154.     Append (s3, s1, ok);
  155.     IF LENGTH(s2) # 0 THEN s1[ofs]:= 0C END;
  156.     Append (s2, s1, ok);
  157.     DelTrailingBlanks (s1);
  158.     IF buffered THEN
  159.       linebuf[line]:= s1;
  160.       IF line > bufferedlines THEN bufferedlines:= line END;
  161.       IF line = lps THEN
  162.         IF onefile THEN
  163.           IF ~second THEN
  164.             second:= TRUE;
  165.             line:= 1;
  166.           ELSE
  167.             second:= FALSE;
  168.             flush;
  169.           END
  170.         ELSE
  171.           flush;
  172.         END
  173.       ELSE
  174.         INC (line)
  175.       END
  176.     ELSE
  177.       Text.WriteString (f3, s1);
  178.       Text.WriteLn (f3);
  179.     END;
  180.     IF Files.EOF (f1) THEN EXIT END;
  181.   END;
  182.   IF buffered THEN
  183.     flush;
  184.   END;
  185.   Files.Close (f3);
  186.   Files.Close (f2);
  187.   Files.Close (f1);
  188. END SpaltenSatz.
  189.